# MultiCauseException.java

    package org.codefilarete.tool.exception;

    import java.util.ArrayList;
    import java.util.List;

    import org.codefilarete.tool.StringAppender;

    /**
     * @author Guillaume Mary
     */
    public class MultiCauseException extends RuntimeException {

    	private final List<Throwable> causes = new ArrayList<>();

    	@Override
    	public synchronized Throwable initCause(Throwable cause) {
    		addCause(cause);
    		return this;
    	}

    	public void addCause(Throwable t) {
    		this.causes.add(t);
    	}

    	public List<? extends Throwable> getCauses() {
    		return causes;
    	}

    	public void throwIfNotEmpty() {
    		if (!this.causes.isEmpty()) {
    			if (this.causes.size() == 1) {
    				throw Exceptions.asRuntimeException(this.causes.get(0));
    			} else {
    				throw this;
    			}
    		}
    	}

    	@Override
    	public String getMessage() {
    		StringAppender message = new StringAppender(1024);
    		for (Throwable cause : causes) {
    			message.cat(cause.getMessage(), ", ");
    		}
    		message.cutTail(2);
    		return "Multi cause exception : " + message;
    	}
    }